/*
 * @Author: 0x9DEFA478
 * @Date: 2024-07-29 17:45:23
 * @LastEditTime: 2024-08-11 21:03:56
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef hAPI_H_TS_Thread_H_
#define hAPI_H_TS_Thread_H_
#include "./H_TS_Config.h"




//线程的Status字段小于0代表线程将要停止, 不是停止就是在停止的路上

//线程已结束运行
#define vH_TS_Thread_Status_Stop                                  -2

//线程请求停止状态
#define vH_TS_Thread_Status_RequestStop                           -1

//线程就绪
#define vH_TS_Thread_Status_Ready                                 0

//线程因事件阻塞
#define vH_TS_Thread_Status_Block                                 1

//线程因睡眠阻塞
#define vH_TS_Thread_Status_Sleep                                 2

//线程因事件阻塞(时间限制)
#define vH_TS_Thread_Status_TimeBlock                             3




typedef struct sH_TS_Thread{
  void* volatile ContextStackPointer;                             //上下文栈指针, 用于线程未运行的上下文保存。其必须是第一个结构体成员

  volatile Hsize Status;                                          //线程状态
  volatile Hsize IsNotReady;                                      //线程是否不在就绪链表/副就绪链表中

  volatile Hsize CPU_Load;
#if vH_TS_IsEnableCPULoadCalculate != 0
  volatile H_TS_RunTime CPU_Load_RunningTime;                     //线程运行时间
#endif  

  volatile Hsize Priority;                                        //优先级 仅影响线程在列表中的排列 值越小 在列表的位置就靠前 优先级高 若有两个线程优先级相同 实际优先级也是一高一低 取决于创建线程时线程加入列表的方式

#ifdef H_TS_ErrnoUpdate
  volatile int Errno;
#endif

  //阻塞对象
  union{

    //因睡眠而阻塞
    struct{
      volatile H_TS_Tick Tick;                                    //用于标记睡眠时间的位端,不一定表示还有多久解除阻塞 (线程在阻塞链表头部时,表示阻塞时间,如果不在头部,还需要加上之前链表的阻塞时间)
    }Sleep;

    //时间限制阻塞
    struct{
      void* volatile BlockObject;                                 //阻塞对象 解除阻塞后被清零
      volatile H_TS_Tick SleepTick;                               //用于标记睡眠时间的位端,不一定表示还有多久解除阻塞 (线程在阻塞链表头部时,表示阻塞时间,如果不在头部,还需要加上之前链表的阻塞时间)
    }TimeBlock;

  }BlockObject;


  volatile Hsize IsIRQUnblock;                                    //不为0时, 中断可认为该线程在待解阻塞链表中
  struct{
    struct sH_TS_Thread* volatile Next;
  }IRQUnblockList;

  //链表相关
  union{

    //就绪链表
    struct{
      struct sH_TS_Thread* volatile Last;
      struct sH_TS_Thread* volatile Next;
      volatile Hsize IsSubReady;                                  //是否在副就绪链表
    }Ready;

    //因等待阻塞(无限等待)
    struct{
      struct sH_TS_Thread* volatile Last;
      struct sH_TS_Thread* volatile Next;
    }Block;

    //因睡眠而阻塞
    struct{
      struct sH_TS_Thread* volatile Last;
      struct sH_TS_Thread* volatile Next;
    }Sleep;

    //因等待阻塞(超时限制)
    struct{
      struct sH_TS_Thread* volatile Last;
      struct sH_TS_Thread* volatile Next;
    }TimeBlock;

    //待退出的线程链表
    struct{
      struct sH_TS_Thread* volatile Next;
    }Exit;

  }List;
  

  //这个链表存放着所有未结束的线程
  struct{
    struct sH_TS_Thread* volatile Last;
    struct sH_TS_Thread* volatile Next;
  }AllList;

  struct{
    void* volatile* Address;
    Hsize Size;
    Hsize MaxUsage;
  }Stack;

  void* volatile Monitor;                                         //指向线程监视器对象

  int RetVal;                                                     //线程返回值

  const char* ThreadName;                                         //线程名字

}H_TS_Thread;

typedef struct sH_TS_ThreadAttribute{
  Hsize Priority;//优先级
  Hsize StackSize;//堆栈大小(如果不是sizeof(void*)的倍数 会被增加到最近的sizeof(void*)倍数)
  const char* ThreadName;//线程名
}H_TS_ThreadAttribute;

//线程信息
typedef struct sH_TS_ThreadInfo{
  Hsize Priority;                                                 //优先级
  const char* ThreadName;                                         //线程名字
  Hsize CPU_Load;                                                 //CPU占用率
  Hsize StackMaxUsage;                                            //历史最大占用
  Hsize StackSize;                                                //堆栈大小 单位:字节
  struct sH_TS_ThreadInfo* Next;
}H_TS_ThreadInfo;




/**
 * @brief 线程休眠
 * @param NumOfTick 休眠的tick数
 * @return 无
 */
void H_TS_ThreadSleep(H_TS_Tick NumOfTick);

/**
 * @brief 新建并开始一个新线程 如果未开始线程调度 线程将在开始线程调度后运行
 * @param Code 线程代码
 * @param v 线程传入参数
 * @param Attribute 属性 如果为NULL代表使用默认属性
 * @return 线程句柄 NULL:失败 其他:成功
 */
H_TS_Thread* H_TS_StartNewThread(int (*Code)(void*),void* v,const H_TS_ThreadAttribute* Attribute);

/**
 * @brief 结束线程自身
 * @param RetVal 线程返回值
 * @return 无
 */
void H_TS_ThreadExit(int RetVal);

/**
 * @brief 获取所有线程的信息
 * @return 线程信息链表, 如果为NULL则代表失败
 */
H_TS_ThreadInfo* H_TS_ThreadInfoListGet(void);

/**
 * @brief 释放线程信息链表
 * @param Info 线程信息
 * @return 无
 */
void H_TS_ThreadInfoListFree(H_TS_ThreadInfo* Info);




#endif //hAPI_H_TS_Thread_H_
